#include <sys/wait.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>

int main()
{
    printf("我的程序要运行了!\n");
    execl("/usr/bin/ls", "ls", "-l", "-a", NULL);
    //execl("/usr/bin/top", "top", NULL);
    printf("我的程序运行完毕了\n");
    return 0;
}

//int main( void )
//{
//    pid_t pid;
//    if ( (pid=fork()) == -1 )
//   		perror("fork"),exit(1);
//    
//		if ( pid == 0 )
//        {
//			sleep(20);
//			exit(10);
//		} 
//    	else 
//        {
//			int st;
//			int ret = wait(&st);
//			if ( ret > 0 && ( st & 0X7F ) == 0 )
//            {	// 正常退出
//				printf("child exit code:%d\n", 	(st>>8)&0XFF);
//			} 
//            else if( ret > 0 ) 
//            {	// 异常退出
//				printf("sig code : %d\n", st&0X7F );
//			}
//		}
//    
//    return 0;
//}
//
//// 函数指针类型
//typedef void (*func_t)();
//
//#define NUM 5
//func_t handlers[NUM+1];
//
//// 如下是任务
//void DownLoad()
//{
//   printf("我是一个下载的任务...\n");
//}
//void Flush()
//{
//   printf("我是一个刷新的任务...\n");
//}
//void Log()
//{
//   printf("我是一个记录日志的任务...\n");
//}
//
//
//// 注册
//
//void registerHandler(func_t h[], func_t f)
//{
//   int i = 0;
//   for(; i < NUM; i++)
//   {
//       if(h[i] == NULL)break;
//   }
//   if(i == NUM) return;
//   h[i] = f;
//   h[i+1] = NULL;
//}
//
//int main()
//{
//   registerHandler(handlers, DownLoad);
//   registerHandler(handlers, Flush);
//   registerHandler(handlers, Log);
//
//   pid_t id = fork();
//   if(id == 0)
//   {
//       //子进程
//       int cnt = 3;
//       while(1)
//       {
//           sleep(3);
//           printf("我是一个子进程, pid : %d, ppid : %d\n", getpid(), getppid());
//           sleep(1);
//           cnt--;
//           //int *p = 0;
//           //*p= 100;
//          // int a = 10;
//          // a /= 0;
//       }
//       exit(10);
//   }
//
//   // 父进程
//   while(1)
//   {
//       int status = 0;
//       pid_t rid = waitpid(id, &status, WNOHANG);
//       if(rid > 0)
//       {
//           printf("wait success, rid: %d, exit code: %d, exit signal: %d\n", rid, (status>>8)&0xFF, status&0x7F) ; // rid
//           break;
//       }
//       else if(rid == 0)
//       {
//           // 函数指针进行回调处理
//           int i = 0;
//           for(; handlers[i]; i++)
//           {
//               handlers[i]();
//           }
//           printf("本轮调用结束，子进程没有退出\n");
//           sleep(1);
//       }
//       else
//       {
//           printf("等待失败\n");
//           break;
//       }
//
//   }
//   return 0;
//}
//
//int main() 
//{
//    pid_t pid = fork();
//    if (pid == 0) 
//    {
//        // 子进程：休眠 3 秒后退出
//        sleep(3);
//        exit(0);
//    } 
//   
//    else if (pid > 0) 
//    {
//        // 父进程：非阻塞等待子进程（轮询检查）
//        int status;
//        while (1) 
//        {
//            pid_t ret = waitpid(pid, &status, WNOHANG);  // 非阻塞
//            if (ret == 0) 
//            {
//                // 子进程未终止，父进程可做其他工作
//                printf("子进程未终止，父进程继续等待...\n");
//                sleep(1);
//            } 
//            else if (ret == pid) 
//            {
//                // 子进程已终止
//                printf("子进程（PID：%d）终止\n", ret);
//                break;
//            }
//        }
//    }
//    return 0;
//}
//
//int main()
//{
//    pid_t pid = fork();
//    if(pid == 0)
//    {
//        // 子进程：执行任务后退出，退出码为 3
//        int cnt = 5;
//        while(cnt--)
//        {
//            printf("子进程，PID：%d，执行中...\n", getpid());// 模拟任务执行
//            sleep(1);
//        }
//       	printf("子进程，PID：%d，执行完毕\n", getpid());
//        exit(3);  // 正常退出，退出码3
//    }
//    else if(pid > 0)
//    {
//        // 父进程：等待子进程终止
//        pid_t exit_id = wait(NULL); //阻塞等待
//       	if(exit_id > 0)
//        {
//            printf("wait success, exit_id: %d\n", exit_id);
//        }
//        sleep(5);
//    }
//    return 0;
//}
//
//int main()
//{
//    printf("main");
//    sleep(2);
//    _exit(2);
//
//    return 0;
//}
//
////void func()
//{
//    printf("fucn() begin\n");
//    exit(40);
//    printf("func() end\n");
//}
//
//int main()
//{
//    func();
//    printf("main\n");
//    return 0;
//}
//

//int main()
//{
//    int a = 10;
//    a /= 0;
//
//    return 666;
//}
//
//int main()
//{
//    int i = 0;
//    for(; i < 200; i++)
//    {
//        printf("%d->%s\n", i, strerror(i));
//    }
//    
//    return 0;
//}
